home *** CD-ROM | disk | FTP | other *** search
/ Monster Media 1996 #15 / Monster Media Number 15 (Monster Media)(July 1996).ISO / prog_c / cuj0696.zip / DWYER.ZIP / SPECTRAL.TST / CALCMERT.CX next >
Text File  |  1996-03-14  |  1KB  |  51 lines

  1. /* ============ */
  2. /* calcmert.c    */
  3. /* ============ */
  4. #include <xtendefs.h>
  5.  
  6. #define    ODD(n)    ((n) & 1)
  7. /* ==================================================================== */
  8. /* CalcMerit - Calculates Merit for given Accuracy, Dimension, Modulus    */
  9. /* ==================================================================== */
  10. void
  11. CalcMerit(USHORT *XS, short N, USHORT *Modulus, USHORT *Merit)
  12.     {
  13.     USHORT  AccP[NE];
  14.     USHORT  Fac[NE];
  15.     USHORT    PiP[NE];
  16.     USHORT    Term[NE];
  17.     USHORT    Tmp1[NE];
  18.     USHORT    Xn[NE], HalfXn[NE];
  19.     long    TmpLng = N;
  20.  
  21.     LONGTOX(TmpLng, Xn);        /* N to extended */
  22.     XMULT(Xn, EHALF, HalfXn);    /* HalfXn = N/2    */
  23.     XPOW(XS, HalfXn, AccP);
  24.  
  25.     XCOPY(EONE, Fac);
  26.  
  27.     XCOPY(HalfXn, Term);
  28.     P(XPRINTF("CalcMert: First Term = ", Term, NDEC));
  29.     while (XGTE(Term, EHALF))
  30.     {
  31.         XMULT(Fac, Term, Fac);
  32.         XSUB(Term, EONE, Term);
  33.         P(XPRINTF("\t  Next  Term = ", Term, NDEC));
  34.     }
  35.  
  36.     if (ODD(N))
  37.     {
  38.         XRSUB(HalfXn, EHALF);    /* HalfXn -= 1/2 */
  39.     }
  40.     else
  41.     {
  42.         /* N/2 Already Calculated */
  43.     }
  44.  
  45.     XPOW(EPI, HalfXn, PiP);
  46.  
  47.     XMULT(PiP, AccP, Tmp1);
  48.     XRDIV(Tmp1, Fac);
  49.     XDIV(Tmp1, Modulus, Merit);
  50.     }
  51.